package com.zqs.compareface.server.camstream;

import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.FrameGrabber;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @program: FaceCompare
 * @description: 问题：
 *  *         1、 发现保存下的视频播放非常快，两倍速，分析发现视频帧将近一半丢失帧率设置问题，推拉流最好一致
 *  *         其他因素： 收流线程不能像发流那样设置线程睡眠
 * @author: ZQS
 * @create: 2021-08-08 18:14
 */
public class CamStreamPullBak {
    public void camStreamPull(String inputFile) throws FFmpegFrameGrabber.Exception {
        Date nowTime = new Date(System.currentTimeMillis());
        SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile);
//        grabber.setOption("rtsp_transport","tcp");
        grabber.setFrameRate(30);
//分辨率
        grabber.setImageWidth(640);
        grabber.setImageHeight(480);
// 流媒体输出地址，分辨率（长，高），是否录制音频（0:不录制/1:录制）
        String outputFile ="";
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 640, 480, 1);
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        recorder.setFormat("flv");
        recorder.setFrameRate(25);
//一般考虑比推流器发送的视频比特流大
        recorder.setVideoBitrate(800000);
//建议在线程中使用该方法
        try {
            grabber.start();
            recorder.start();
            Frame frame = null;
            while ((frame = grabber.grabFrame()) != null) {
                recorder.record(frame);
                //休眠，如果是录制视频就不能要，否则丢帧
//                Thread.sleep(40);
                System.out.println(sdFormatter.format(System.currentTimeMillis()));
            }
            recorder.stop();
            grabber.stop();
        } catch (FFmpegFrameGrabber.Exception e) {
            e.printStackTrace();
        } catch (FFmpegFrameRecorder.Exception e) {
            e.printStackTrace();
        } catch (FrameGrabber.Exception e) {
            e.printStackTrace();
        } finally {
            if (grabber != null) {
                grabber.stop();
            }
        }
    }
}
